iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
自我挑戰組

30 天 Node.js 探索:基礎、進階與實踐系列 第 23

Day 23: 設置財務記錄的資料模型與 CRUD

  • 分享至 

  • xImage
  •  

今天將建立財務記錄的資料模型,並實現相應的 CRUD (Create, Read, Update, Delete) 功能,讓用戶能夠新增、檢視、修改和刪除財務紀錄,這是個人財務管理應用的核心功能之一。

設計 Transaction 模型

財務記錄將使用 Transaction 模型來儲存。每筆交易將包含交易類型(收入或支出)、金額、描述和日期等基本訊息。
在 models/ 文件夾中創建 Transaction.js:

js
const mongoose = require('mongoose');

const transactionSchema = new mongoose.Schema({
  user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
  type: { type: String, enum: ['income', 'expense'], required: true },
  amount: { type: Number, required: true },
  description: { type: String, required: true },
  date: { type: Date, default: Date.now },
});

module.exports = mongoose.model('Transaction', transactionSchema);
  • user: 用來關聯每個交易和用戶的 ID,確保每筆交易屬於某個用戶。
  • type: 表示交易的類型(收入或支出)。
  • amount: 交易的金額。
  • description: 用戶為這筆交易的描述。
  • date: 交易的發生日期,預設為當前日期。

新增財務記錄 (Create)

接著要實現新增財務記錄的功能,允許用戶添加收入或支出的交易。
在 routes/ 文件夾中創建 transactions.js,設置一個 POST 請求來處理新增交易的操作:

js
const express = require('express');
const auth = require('../middleware/authMiddleware');
const Transaction = require('../models/Transaction');

const router = express.Router();

// 新增交易
router.post('/', auth, async (req, res) => {
  const { type, amount, description } = req.body;

  try {
    const transaction = new Transaction({
      user: req.user,
      type,
      amount,
      description,
    });

    await transaction.save();
    res.status(201).json(transaction);
  } catch (error) {
    res.status(500).json({ msg: 'Server error' });
  }
});

module.exports = router;

用戶需要傳送 type、amount 和 description 來新增一筆交易,並且這個操作受 JWT 保護,必須通過身份驗證。

查詢財務記錄 (Read)

為了讓用戶檢視他們的財務紀錄,需要提供一個 GET 請求來獲取屬於用戶的所有交易。
在 transactions.js 中繼續實現查詢交易功能:

js
// 查詢用戶的所有交易
router.get('/', auth, async (req, res) => {
  try {
    const transactions = await Transaction.find({ user: req.user }).sort({ date: -1 });
    res.json(transactions);
  } catch (error) {
    res.status(500).json({ msg: 'Server error' });
  }
});

這段程式碼會根據當前用戶的 ID 查詢他們的所有交易,並按照日期降序排列。

更新財務記錄 (Update)

用戶可能需要修改已經存在的交易,例如更新金額或描述。所以要做一個 PUT 請求來修改指定的交易。
在 transactions.js 中添加更新程式碼:

js
// 更新交易
router.put('/:id', auth, async (req, res) => {
  const { type, amount, description } = req.body;

  try {
    let transaction = await Transaction.findById(req.params.id);

    if (!transaction) {
      return res.status(404).json({ msg: 'Transaction not found' });
    }

    // 確認該交易屬於當前用戶
    if (transaction.user.toString() !== req.user) {
      return res.status(401).json({ msg: 'Not authorized' });
    }

    // 更新交易訊息
    transaction = await Transaction.findByIdAndUpdate(
      req.params.id,
      { type, amount, description },
      { new: true }
    );

    res.json(transaction);
  } catch (error) {
    res.status(500).json({ msg: 'Server error' });
  }
});

在這邊要注意查詢要修改的交易是否存在,並確保該交易屬於當前用戶,然後進行更新。

刪除財務記錄 (Delete)

當用戶想要刪除一筆交易時,需要提供一個 DELETE 請求來刪除指定交易。
在 transactions.js 中加入刪除功能:

js
// 刪除交易
router.delete('/:id', auth, async (req, res) => {
  try {
    const transaction = await Transaction.findById(req.params.id);

    if (!transaction) {
      return res.status(404).json({ msg: 'Transaction not found' });
    }

    // 確認該交易屬於當前用戶
    if (transaction.user.toString() !== req.user) {
      return res.status(401).json({ msg: 'Not authorized' });
    }

    await transaction.remove();
    res.json({ msg: 'Transaction removed' });
  } catch (error) {
    res.status(500).json({ msg: 'Server error' });
  }
});

這個操作會查詢指定交易並確認該交易屬於當前用戶,然後將其從資料庫中移除。

整合與測試

在 server.js 中整合交易路由:

js
const transactionRoutes = require('./routes/transactions');
app.use('/api/transactions', transactionRoutes);

使用 Postman 或其他 API 測試工具來測試 CRUD 功能:

  1. 發送 POST 請求到 /api/transactions 來新增交易。
  2. 發送 GET 請求到 /api/transactions 來查詢交易。
  3. 發送 PUT 請求到 /api/transactions/:id 來更新交易。
  4. 發送 DELETE 請求到 /api/transactions/:id 來刪除交易。

總結

今天設置了財務記錄的資料模型並實現了 CRUD 操作,包括新增、查詢、更新和刪除財務交易。這些功能讓應用能夠管理用戶的收入和支出記錄,實現了個人財務管理應用的核心功能。之後將進一步優化這些功能,加入更多的應用功能。


上一篇
Day 22: 註冊與登入功能 (JWT 驗證)
下一篇
Day 24: 資料庫連接與中介軟體設置
系列文
30 天 Node.js 探索:基礎、進階與實踐26
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言